import change.ChangeMove;
import change.ChangePheromone;
import create.CreateCar;
import init.InitCarAbility;
import init.InitCarProbability;
import init.InitCarRelation;
import init.InitLine;
import objects.CarBase;
import objects.CarNodeStore;
import objects.LinkNode;

import java.util.ArrayList;
import java.util.List;

/**
 * @author whn
 * 这里写具体逻辑。
 * 大体思路：建立车辆模型，完善连接性矩阵，
 * 根据矩阵和车的具体内容进行运算，将连接性转换为链接链表，推荐使用链表记录链接，
 * 建立初始链接后，随着车辆的移动这个链接可能是不固定的，所以在数据包发送过程中t的变化要先确定，
 * 其次，因为ACO的理论，初始链接是通过多次蚂蚁迭代得出的结论，所以确定将所有的链接都记录在数组tour中，
 * 然后得到所有的tour后对其遍历，找到距离短，延时低的一条作为最终结果。
 * 将路径放入CarNodeStore对象中，作为数据包路由的最终路径，
 * 数组tour的设计：路径的链表，链表元素为车，车的信息素参与度和LT；    在路径外还应保留一个断开阈值和最低信息素位置
 * 车list，用于替换和在替换时找到是否已经参与了
 */
public class Car {
    public static void main(String[] args) {
        /**
         * 创建车辆的list，这个list被存在一个CarNodeStore对象中，便于后续调用
         */
        List<CarBase> carBaseList = CreateCar.create();
        CarNodeStore carNodeStore = new CarNodeStore(carBaseList,
                new int[carBaseList.size()][carBaseList.size()],
                new double[carBaseList.size()][carBaseList.size()],
                new double[carBaseList.size()][carBaseList.size()],
                new double[carBaseList.size()][carBaseList.size()],
                new double[carBaseList.size()],new ArrayList<>());
        carNodeStore.setCarList(carBaseList);

        /**
         * 开始迭代，这里写迭代编码
         * 迭代中应该注意：每次断线后都要重新计算能力，也就是断线后对carNodeStore对象中的所有状态矩阵赋初值。
         */
        InitCarRelation.init(carNodeStore);
        InitCarAbility.init(carNodeStore);
        InitCarProbability.init(carNodeStore);
        InitLine.init(carNodeStore);
        for (int i = 0; i < 10; i++) {
            InitCarRelation.init(carNodeStore);
            InitCarAbility.init(carNodeStore);
            InitCarProbability.init(carNodeStore);
            ChangeMove.updateMove(carNodeStore, 0.1);
            ChangePheromone.update(carNodeStore);
            System.out.println(carNodeStore.toString());
        }
    }

}
